<?php
/**
 * 自定义验证码控制器
 * 解决ThinkPHP验证码扩展路由问题
 */

declare(strict_types=1);

namespace app\controller;

use think\captcha\facade\Captcha;
use think\Response;

class CaptchaController
{
    /**
     * 测试方法
     */
    public function test()
    {
        return json([
            'code' => 0,
            'msg' => '验证码控制器正常工作',
            'data' => [
                'timestamp' => time(),
                'method' => 'test'
            ]
        ]);
    }
    
    /**
     * 生成验证码
     * @param string $config 验证码配置
     * @return mixed
     */
    public function index($config = '')
    {
        try {
            // 记录调试信息
            \think\facade\Log::info('验证码控制器被调用, config: ' . $config);
            
            // 设置无缓存头
            header('Cache-Control: no-cache, no-store, must-revalidate');
            header('Pragma: no-cache');
            header('Expires: 0');
            
            // 生成验证码并直接输出
            ob_start();
            $result = Captcha::create($config);
            
            // 如果是响应对象，直接返回
            if ($result instanceof \think\Response) {
                return $result;
            }
            
            // 否则返回缓冲区内容
            $content = ob_get_clean();
            if (!empty($content)) {
                header('Content-Type: image/png');
                echo $content;
                return;
            }
            
            // 如果都失败，返回错误
            throw new \Exception('验证码生成失败');
            
        } catch (\Exception $e) {
            // 记录错误日志
            \think\facade\Log::error('验证码生成失败: ' . $e->getMessage());
            
            // 返回错误响应
            return response('验证码生成失败: ' . $e->getMessage(), 500);
        }
    }
    
    /**
     * 验证验证码
     * @param string $code 验证码
     * @return array
     */
    public function check($code = '')
    {
        try {
            // 记录调试信息
            \think\facade\Log::info('验证码验证请求, code: ' . $code);

            $result = Captcha::check($code);

            // 确保返回布尔值
            if (is_array($result)) {
                // 如果返回数组，提取验证结果
                $result = isset($result['result']) ? (bool)$result['result'] : false;
            }

            return [
                'code' => $result ? 0 : 1,
                'msg' => $result ? '验证成功' : '验证码错误',
                'data' => null
            ];

        } catch (\Exception $e) {
            \think\facade\Log::error('验证码验证失败: ' . $e->getMessage());

            return [
                'code' => 1,
                'msg' => '验证码验证失败: ' . $e->getMessage(),
                'data' => null
            ];
        }
    }
}